﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpGuiMainFrameInterface.h"
#include "OwnerPtr.h"

namespace gcmp
{

class ICommandButtonDefinition;
class ICheckBoxGroupDefinition;
class IRadioButtonGroupDefinition;
class IComboBoxDefinition;
class ILineEditDefinition;
class ICommandButtonMenuDefinition;
class ILabelDefinition;
class IProgressBarDefinition;
class IControl;

/// \brief 状态栏内面板对齐
enum class StatusBarAlignment : int32_t
{
    Left,   ///< 状态栏内左边区域
    Right   ///< 状态栏内右边区域
};

/// \brief 状态栏内的面板，用来组织一组控件
class GCMP_GUI_MAIN_FRAME_INTERFACE_EXPORT IStatusBarPanel
{
public:
    /// \brief 创建状态栏面板
    ///
    /// \param panelId 面板id，状态栏内必须唯一
    /// \param minWidth 面板最小宽度（像素）
    /// \param stretch 伸展因子，大于0代表在状态栏内该面板长度会伸展，伸展长度由状态栏内水平布局自动计算，计算时会考虑其他面板的伸展因子等
    /// \return 状态栏面板指针
    static OwnerPtr<IStatusBarPanel> Create(const std::wstring& panelId, int minWidth = 0, int stretch = 0);

    /// \brief 析构函数
    virtual ~IStatusBarPanel() = 0;

    /// \brief 获取面板id
    virtual std::wstring GetPanelId() const = 0;

    /// \brief 添加按钮
    ///
    /// \param pButtonDefinition 要添加的按钮数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddButton(OwnerPtr<ICommandButtonDefinition> pButtonDefinition) = 0;

    /// \brief 添加单行输入框
    ///
    /// \param pLineEditDefinition 要添加的当行输入框数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddLineEdit(OwnerPtr<ILineEditDefinition> pLineEditDefinition) = 0;

    /// \brief 添加组合框
    ///
    /// \param pComboBoxDefinition 要添加的组合框数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddComboBox(OwnerPtr<IComboBoxDefinition> pComboBoxDefinition) = 0;

    /// \brief 添加菜单按钮
    ///
    /// \param pButtonMenuDefinition 要添加的菜单按钮数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddButtonMenu(OwnerPtr<ICommandButtonMenuDefinition> pButtonMenuDefinition) = 0;

    /// \brief 添加复选框组
    ///
    /// \param pCheckBoxGroupDefinition 要添加的复选框组数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddCheckBoxGroup(OwnerPtr<ICheckBoxGroupDefinition> pCheckBoxGroupDefinition) = 0;

    /// \brief 添加单选按钮组
    ///
    /// \param pRadioButtonGroupDefinition 要添加的单选按钮组数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddRadioButtonGroup(OwnerPtr<IRadioButtonGroupDefinition> pRadioButtonGroupDefinition) = 0;

    /// \brief 添加标签
    ///
    /// \param pLabelDefinition 要添加的标签数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddLabel(OwnerPtr<ILabelDefinition> pLabelDefinition) = 0;

    /// \brief 添加进度条
    ///
    /// \param pProgressBarDefinition 要添加的进度条数据定义，一个面板内不能添加多个相同的数据定义
    /// \return 刚添加的控件指针
    virtual IControl* AddProgressBar(OwnerPtr<IProgressBarDefinition> pProgressBarDefinition) = 0;

    /// \brief 插入按钮
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pButtonDefinition 要插入的按钮数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertButton(const std::wstring& followingControlDefinitionId, OwnerPtr<ICommandButtonDefinition> pButtonDefinition) = 0;

    /// \brief 插入单行输入框
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pLineEditDefinition 要插入的单行输入框数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertLineEdit(const std::wstring& followingControlDefinitionId, OwnerPtr<ILineEditDefinition> pLineEditDefinition) = 0;

    /// \brief 插入组合框
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pComboBoxDefinition 要插入的组合框数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertComboBox(const std::wstring& followingControlDefinitionId, OwnerPtr<IComboBoxDefinition> pComboBoxDefinition) = 0;

    /// \brief 插入菜单按钮
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pButtonMenuDefinition 要插入的菜单按钮数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertButtonMenu(const std::wstring& followingControlDefinitionId, OwnerPtr<ICommandButtonMenuDefinition> pButtonMenuDefinition) = 0;

    /// \brief 插入复选框组
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pCheckBoxGroupDefinition 要插入的复选框组数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertCheckBoxGroup(const std::wstring& followingControlDefinitionId, OwnerPtr<ICheckBoxGroupDefinition> pCheckBoxGroupDefinition) = 0;

    /// \brief 插入单选按钮组
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pRadioButtonGroupDefinition 要插入的单选按钮组数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertRadioButtonGroup(const std::wstring& followingControlDefinitionId, OwnerPtr<IRadioButtonGroupDefinition> pRadioButtonGroupDefinition) = 0;

    /// \brief 插入标签
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pLabelDefinition 要插入的标签数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertLabel(const std::wstring& followingControlDefinitionId, OwnerPtr<ILabelDefinition> pLabelDefinition) = 0;

    /// \brief 插入进度条
    ///
    /// 在followingControlDefinitionId之前插入，新插入的数据定义id不能和状态栏面板上已有的数据定义相同
    /// \param followingControlDefinitionId 插入参考数据定义id
    /// \param pProgressBarDefinition 要插入的进度条数据定义
    /// \return 刚插入的控件指针
    virtual IControl* InsertProgressBar(const std::wstring& followingControlDefinitionId, OwnerPtr<IProgressBarDefinition> pProgressBarDefinition) = 0;

    /// \brief 根据数据定义id获取控件
    ///
    /// \param id 要获取的控件的数据定义id
    /// \return 数据定义id对应的控件指针
    virtual IControl* GetControl(const std::wstring& id) const = 0;

    /// \brief 获取所有控件
    ///
    /// \return 该面板上所有控件指针
    virtual std::vector<IControl*> GetAllControls() const = 0;

    /// \brief 根据数据定义id删除控件
    ///
    /// \param id 要删除的控件的数据定义id
    /// \return 成功删除返回true，否则返回false
    virtual bool DeleteControl(const std::wstring& id) = 0;

    /// \brief 删除所有控件
    virtual void DeleteAllControls() = 0;

    /// \brief 更新该状态栏面板上每个控件的状态，会调用每个控件的的UpdateStatus方法
    virtual void UpdateControlStatus() = 0;
};

}   // end namespace gcmp
